import type { NextFunction, Request, Response } from 'express';

import { SafeParseReturnType, ZodType } from 'zod';

import resp from '../utils/response';
/**
 * 通用的校验中间件生成器
 * @param key 校验对象（body、params、query）
 * @param schema zod 校验 schema
 * @returns Express 中间件函数
 */
function validMiddleware<T extends ZodType>(key: 'body' | 'params' | 'query', schema: T) {
  // 返回中间件函数
  return (req: Request, res: Response, next: NextFunction): Response | void => {
    // 使用 zod 校验 req[key]
    const result: SafeParseReturnType<unknown, unknown> = schema.safeParse(req[key]);
    if (!result.success) {
      // 整理并合并所有错误信息
      const errorMessage = result.error.errors.map(err => err.message).join(', ');
      // 返回 400 错误响应
      return resp.error(res, 400, errorMessage);
    }
    // 校验通过，将解析后的数据覆盖原 req[key]
    req[key] = result.data;
    next();
  };
}
/**
 * 校验工具类，支持 body、query、params 三种对象校验
 */
export default class Valid {
  /**
   * 校验 req.body
   * @param schema zod 校验 schema
   * @returns Express 中间件函数
   */
  static body<T extends ZodType>(
    schema: T,
  ): (req: Request, res: Response, next: NextFunction) => Response | void {
    return validMiddleware('body', schema);
  }

  /**
   * 校验 req.params
   * @param schema zod 校验 schema
   * @returns Express 中间件函数
   */
  static params<T extends ZodType>(
    schema: T,
  ): (req: Request, res: Response, next: NextFunction) => Response | void {
    return validMiddleware('params', schema);
  }

  /**
   * 校验 req.query
   * @param schema zod 校验 schema
   * @returns Express 中间件函数
   */
  static query<T extends ZodType>(
    schema: T,
  ): (req: Request, res: Response, next: NextFunction) => Response | void {
    return validMiddleware('query', schema);
  }
}
